package com.j.lemon.learn.thread.CAS;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author lijunjun
 * @Date 2019-04-17 14:38
 * @Description cas比较并交换，线程从主物理内存拷贝副本到工作内存，写回主物理内存时，先判断此时主物理内存的值和期望值是否相同，如果相同，则更新
 * 主物理内存的值，如果不相同，则重新读取主物理内存的值，再与期望值进行比较，不断重复此操作，直到成功更新主物理内存的值。
 *
 * cas->unsafe->cas底层（比较并转换）->ABA问题 ->原子引用更新 ->如何规避ABA问题
 *
 * cas缺点：不停的循环自旋，增加cpu开销大
 *         只能保证一个共享变量的原子操作
 *         ABA问题
 */
public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 1));
        System.out.println(atomicInteger.compareAndSet(2, 3));
        System.out.println(atomicInteger.get());
    }
}
